package net.scala.chapter1.o

/**
 * 伸缩性和扩展性
 * @author chenyy2@corp.21cn.com
 */
object Scalable {

  def main(args: Array[String]) {

    /*
     * DEFINITION
     * Closure is a first-class function with free variables that are bound
     * in the lexical environment. In the loopTill example, the free variable is i.
     * Even though it’s defined outside the closure, you could still use it inside. The
     * second parameter in the loopTill example is a closure, and in Scala that’s
     * represented as an object of type scala.Function0.
     * 闭包是第一类函数(first-class function)，为词法闭包(Lexical Closure)的简称，即为引用了
     * 自由变量的函数。
     * 在loopTill例子中，自由变量为i，尽管它定义在闭包的外面，你仍然可以将其在闭包内部使用。在loopTill
     * 中，第二个参数是一个闭包，在Scala中表示一个Scala.Function0的对象类型。
     * 即     new Function0{cond -> i > 0    body -> print(f"$i ") i -= 1}
     */
    def loopTill(cond: => Boolean)(body: => Unit): Unit = {
      if (cond) {
        body
        loopTill(cond)(body)    // 尾递归
      }
    }
    var i = 10
    loopTill(i > 0) {
      // 格式化输出
      print(f"$i ")
      i -= 1
    }
    println()

    /*
    * 在该例中，.par将List转换为并行容器(parallel collection)，并通过并行算法来实现map方法。实现了并行
    * 容器会将线程分解执行并通过map方法使用所有的CPU核数。
    */
    // 顺序容器
    val pv = Vector(1,2,3,4,5,6,7,8,9)
    println(pv)
    // 转换为并行容器
    println(pv.par)
    // 并行容器
    val list = List(1, 2, 3).par.map(x => x * x)
    println(list)
  }
}
